#ifndef __49STRING_H__
#define __49STRING_H__

#include <iostream>
using std::istream;
using std::ostream;

class String
{
private:
    char *str;                        // 存储char对应的指针
    int len;                          // string长度
    static int str_count;             // string个数计数
    static const int CIN_LIMIT = 100; // cin输入限制大小

public:
// 构造函数
    String(const char *s);   // 构造函数
    String();                // 构造函数
    String(const String &s); // 复制构造函数 (传参,强转)
// 析构函数
    ~String();               // 析构函数
                             // 重载运算符
    String &operator=(const String &);
    String &operator=(const char *);
    char &operator[](int i);
    // String[10]; 将会转换为 char & String operator[](10); 并且返回一个char引用

    // 如果有const String[10]的话,这个语句会报错,因为C++区分const常量标识,下面添加一个带const的即可
    const char &operator[](int i) const;

// 友元函数
    friend bool operator<(const String &st1, const String &st2);
    friend bool operator>(const String &st1, const String &st2);
    friend bool operator==(const String &st1, const String &st2);

    // 因为前面使用的using std::ostream,可以不用在函数中指定std::
    friend ostream &operator<<(ostream &os, const String &st);
    friend istream &operator>>(istream &is, String &st);

// 常规函数
    int length() const; // 后面的const表示返回的int值不变

// 静态成员函数
    static int howMany(){
        //“this”只能用于非静态成员函数内部
        // return this->str_count;
        return str_count;
    }
};

#endif // __49STRING_H__